repo: Port uncompressed cache GC to libglnx
authorColin Walters <walters@verbum.org>
Sun, 29 May 2016 17:29:18 +0000 (13:29 -0400)
committerAtomic Bot <atomic-devel@projectatomic.io>
Mon, 30 May 2016 11:33:28 +0000 (11:33 +0000)
 - Kills a user of `gs_file_unlink`
 - Is fd-relative
 - Is way less malloc-y.

Closes: #312
Approved by: giuseppe

src/libostree/ostree-repo-checkout.c

index 0a77da0280b9daeeb70c87750f407e260eb72cee..95d3747bf8abea336caf619c63b9ea63c8f628ff 100644 (file)
@@ -957,38 +957,36 @@ ostree_repo_checkout_gc (OstreeRepo        *self,
     g_hash_table_iter_init (&iter, to_clean_dirs);
   while (to_clean_dirs && g_hash_table_iter_next (&iter, &key, &value))
     {
-      g_autoptr(GFile) objdir = NULL;
-      g_autoptr(GFileEnumerator) enumerator = NULL;
-      g_autofree char *objdir_name = NULL;
-
-      objdir_name = g_strdup_printf ("%02x", GPOINTER_TO_UINT (key));
-      objdir = g_file_get_child (self->uncompressed_objects_dir, objdir_name);
-
-      enumerator = g_file_enumerate_children (objdir, "standard::name,standard::type,unix::inode,unix::nlink", 
-                                              G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
-                                              cancellable, 
-                                              error);
-      if (!enumerator)
+      g_autofree char *objdir_name = g_strdup_printf ("%02x", GPOINTER_TO_UINT (key));
+      g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
+
+      if (!glnx_dirfd_iterator_init_at (self->uncompressed_objects_dir_fd, objdir_name, FALSE,
+                                        &dfd_iter, error))
         goto out;
-  
+
       while (TRUE)
         {
-          GFileInfo *file_info;
-          guint32 nlinks;
+          struct dirent *dent;
+          struct stat stbuf;
 
-          if (!gs_file_enumerator_iterate (enumerator, &file_info, NULL,
-                                           cancellable, error))
+          if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
             goto out;
-          if (file_info == NULL)
+          if (dent == NULL)
             break;
+
+          if (fstatat (dfd_iter.fd, dent->d_name, &stbuf, AT_SYMLINK_NOFOLLOW) != 0)
+            {
+              glnx_set_error_from_errno (error);
+              goto out;
+            }
           
-          nlinks = g_file_info_get_attribute_uint32 (file_info, "unix::nlink");
-          if (nlinks == 1)
+          if (stbuf.st_nlink == 1)
             {
-              g_autoptr(GFile) objpath = NULL;
-              objpath = g_file_get_child (objdir, g_file_info_get_name (file_info));
-              if (!gs_file_unlink (objpath, cancellable, error))
-                goto out;
+              if (unlinkat (dfd_iter.fd, dent->d_name, 0) != 0)
+                {
+                  glnx_set_error_from_errno (error);
+                  goto out;
+                }
             }
         }
     }